package com.sky.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.web.util.UriUtils;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.LinkedHashMap;
import java.util.Map;

public class SearchHttpUtil {

    public static String AK = "GYZBR14SIVSKGo9hKcsoYj1SsoSxdHqI";



    /**
     * 默认ak
     * 选择了ak，使用IP白名单校验：
     * 根据您选择的AK已为您生成调用代码
     * 检测到您当前的ak设置了IP白名单校验
     * 您的IP白名单中的IP非公网IP，请设置为公网IP，否则将请求失败
     * 请在IP地址为xxxxxxx的计算发起请求，否则将请求失败
     */
    public static Double[] requestGetLngLat(Map<String, String> param) throws Exception {
        String strUrl = "https://api.map.baidu.com/geocoding/v3?";

        if (strUrl == null || strUrl.length() <= 0 || param == null || param.size() <= 0) {
            return new Double[]{0.0, 0.0};
        }

        StringBuffer queryString = new StringBuffer();
        queryString.append(strUrl);
        for (Map.Entry<?, ?> pair : param.entrySet()) {
            queryString.append(pair.getKey() + "=");
            //    第一种方式使用的 jdk 自带的转码方式  第二种方式使用的 spring 的转码方法 两种均可
            //    queryString.append(URLEncoder.encode((String) pair.getValue(), "UTF-8").replace("+", "%20") + "&");
            queryString.append(UriUtils.encode((String) pair.getValue(), "UTF-8") + "&");
        }

        if (queryString.length() > 0) {
            queryString.deleteCharAt(queryString.length() - 1);
        }

        URL url = new URL(queryString.toString());
        System.out.println(queryString.toString());
        // 创建并打开到指定URL的连接。
        // 此处将URL实例转换为HttpURLConnection类型，以便进行更具体的HTTP请求配置与处理。
        URLConnection httpConnection = (HttpURLConnection) url.openConnection();

        // 发起与远程资源的连接。此步骤将实际建立与服务器的网络连接。
        httpConnection.connect();

        // 从HttpURLConnection获取输入流，用于读取服务器响应的数据。
        InputStreamReader isr = new InputStreamReader(httpConnection.getInputStream());

        // 使用BufferedReader包装InputStreamReader，以提高文本读取效率。
        BufferedReader reader = new BufferedReader(isr);

        // 初始化StringBuffer用于存储读取到的所有行数据。
        StringBuffer buffer = new StringBuffer();

        // 逐行读取响应内容，直到没有更多行。
        String line;
        while ((line = reader.readLine()) != null) {
            // 将读取到的每一行数据追加到缓冲区中。
            buffer.append(line);
        }

        reader.close();
        isr.close();
//        System.out.println("AK: " + buffer.toString());

        // 解析JSON字符串为JSONObject对象
        JSONObject jsonObject = JSON.parseObject(buffer.toString());

        // 安全地获取"result"对象
        JSONObject resultObj = jsonObject.getJSONObject("result");
        if (resultObj != null) {
            // 从"result"对象中安全地获取"location"对象
            JSONObject locationObj = resultObj.getJSONObject("location");
            if (locationObj != null) {
                Double lng = new BigDecimal(locationObj.getDouble("lng")).setScale(6, RoundingMode.HALF_UP).doubleValue();
                Double lat = new BigDecimal(locationObj.getDouble("lat")).setScale(6, RoundingMode.HALF_UP).doubleValue();
                // 假设location对象内包含经纬度信息，这里以获取"lng"和"lat"为例
                if (lng != null && lat != null) {
                    return new Double[]{lat, lng};
                }
            } else {
                System.out.println("No 'location' found in the 'result'.");
            }
        } else {
            System.out.println("No 'result' found in the JSON object.");
        }
        return new Double[]{0.0, 0.0};
    }

    /**
     * 默认ak
     * 选择了ak，使用IP白名单校验：
     * 根据您选择的AK已为您生成调用代码
     * 检测到您当前的ak设置了IP白名单校验
     * 您的IP白名单中的IP非公网IP，请设置为公网IP，否则将请求失败
     * 请在IP地址为xxxxxxx的计算发起请求，否则将请求失败
     */
    public static Integer requestGetAK(Map<String, String> param) throws Exception {
        String strUrl = "https://api.map.baidu.com/direction/v2/riding?";
        if (strUrl == null || strUrl.length() <= 0 || param == null || param.size() <= 0) {
            return null;
        }

        StringBuffer queryString = new StringBuffer();
        queryString.append(strUrl);
        for (Map.Entry<?, ?> pair : param.entrySet()) {
            queryString.append(pair.getKey() + "=");
            //    第一种方式使用的 jdk 自带的转码方式  第二种方式使用的 spring 的转码方法 两种均可
            //    queryString.append(URLEncoder.encode((String) pair.getValue(), "UTF-8").replace("+", "%20") + "&");
            queryString.append(UriUtils.encode((String) pair.getValue(), "UTF-8") + "&");
        }

        if (queryString.length() > 0) {
            queryString.deleteCharAt(queryString.length() - 1);
        }

        URL url = new URL(queryString.toString());
        System.out.println(queryString.toString());
        URLConnection httpConnection = (HttpURLConnection) url.openConnection();
        httpConnection.connect();

        InputStreamReader isr = new InputStreamReader(httpConnection.getInputStream());
        BufferedReader reader = new BufferedReader(isr);
        StringBuffer buffer = new StringBuffer();
        String line;
        while ((line = reader.readLine()) != null) {
            buffer.append(line);
        }
        reader.close();
        isr.close();
//        System.out.println("AK: " + buffer.toString());
        JSONObject jsonObject = JSON.parseObject(buffer.toString());
        String distance = jsonObject.getJSONObject("result").getJSONArray("routes").getJSONObject(0).getString("distance");
        System.out.println("distance: " + distance);
        String duration = jsonObject.getJSONObject("result").getJSONArray("routes").getJSONObject(0).getString("duration");
        System.out.println("duration: " + duration);
        System.out.println(Integer.parseInt(distance));
        return  Integer.parseInt(distance);
    }

    public static boolean isFarDistance(String address1,String address2) throws Exception {
        Map params1 = new LinkedHashMap<String, String>();
        params1.put("address", address1);
        params1.put("output", "json");              // "location":{"lng":115.02349736986922,"lat":25.86985548985326} 赣州市赣县区城关小学
        params1.put("ak", AK);

        Map params2 = new LinkedHashMap<String, String>();
        params2.put("address", address2); //"location":{"lng":115.0211620450357,"lat":25.87734858338791} 赣州市赣县区城北市场
        params2.put("output", "json");              // "location":{"lng":115.02349736986922,"lat":25.86985548985326} 赣州市赣县区城关小学
        params2.put("ak", AK);

        Double[] doubles1 = requestGetLngLat(params1);
        Double[] doubles2 = requestGetLngLat(params2);

        Map params = new LinkedHashMap<String, String>();
        params.put("origin", doubles1[0] + "," + doubles1[1]);
        params.put("destination", doubles2[0] + "," + doubles2[1]);
        params.put("ak", AK);
        Integer distance = requestGetAK(params);
        if (distance > 5000) {
            return true;
        } else {
            return false;
        }
    }
}
